﻿
#include "Engine/common.h"
#include "DNF定义.h"
#include "DNF对象定义.h"

void DNF角色对象::重置属性()
{
	for (int i=角色物理攻击力;i<=角色旧_持续伤害;i++)
		角色属性[i]=0.0f;
	角色属性[角色技能伤害]=1.0f;

	装备攻强成长倍率=1.0f;

	技能冷却减少记录=1.0f;
	技能恢复加快记录=0.0f;
	装备加成开关=FALSE;
	面板冷却统计开关=TRUE;
	攻速鞋部位标记=L"其他部位";

	附魔倍率=1.0f;
	攻速鞋适用攻速=0.0f;
	装备提供的睡眠抗性=0.0f;
	装备技能范围=0.0f;
	MP额外消耗量=0.0f;
	特性技能增加标记=FALSE;
	酷寒一击标记=FALSE;
	傀儡一击标记=FALSE;

	增伤倍率=1.0f;
	物攻百分比提升率=1.0f;
	魔攻百分比提升率=1.0f;
	独立百分比提升率=1.0f;
	基础精通倍率=1.0f;

	for (int i=0;i<套装总数;i++)
		套装数量记录[i]=0;

	重置异常();

	重置条件信息();
}

void DNF角色对象::重置异常()
{
	//计算时没有是否处于异常状态的概念，完全以触发频率判定
	//为了计算min简单，以999作为初始值，等于999的值在计算时忽略
	//当用户设置怪物处于某种异常时，等价于该异常0间隔触发
	//但频率只是理论频率，适用值还会受到破韧和装备的影响
	for (int i=0;i<异常状态总数;i++)
		异常属性[i].重置();
	异常属性[出血].更新频率(出血触发频率间隔);
	异常属性[中毒].更新频率(中毒触发频率间隔);
	异常属性[灼伤].更新频率(灼伤触发频率间隔);
	异常属性[感电].更新频率(感电触发频率间隔);
	for (int i=冰冻;i<异常状态总数;i++)
		异常属性[i].更新频率(控制型异常触发频率间隔);
	for (int i=0;i<异常状态总数;i++)
	{
		if (敌人异常状态标记[i])
			异常属性[感电].更新频率(0);
	}
	破冰增伤增加量=0;
}

void DNF角色对象::异常条件技能伤害提升(DNF异常状态类型 类型,float 提升量)
{
	//这个算法有问题，状态本身持续30s，基本可以覆盖，主要检查能不能触发就行了
	//而且很多效果是进入XX状态X秒，和基础值不一样就没法算
	/*
	//对于"攻击XX异常状态的敌人时，技能伤害+X"词条，可能会因为异常频率太低导致无法触发
	//理论上只要不是0间隔保持全程，都有损失，这里进行保有率计算

	//频率间隔为0时，视为强制破韧，100%触发（来源可能是设置或装备）
	if (异常属性[类型].触发频率==0)
		异常条件技能伤害*=1+提升量;
	//怪物不存在此类异常
	else if (异常属性[类型].触发频率==999)
		return ;
	//非破韧状态下控制型异常不生效
	else if (类型>=伤害型异常总数 && 适用控制型异常==FALSE)
		return ;
	//伤害型异常无视破韧，或控制型异常+破韧
	else
	{
		//诅咒时间取平均
		float 异常基础时间[异常状态总数]={3, 5, 5, 10, 5, 3, 3, 6.9, 5, 10, 10, 5, 5};
		float 持续时间=异常基础时间[类型]*(1.0+异常属性[类型].持续时间百分比增加量)+异常属性[类型].持续时间增加量;
		float 保有率=持续时间/异常基础时间[类型];
		保有率=min(保有率,1);
		异常条件技能伤害*=1.0f+(提升量*保有率);
	}
	*/

	//频率间隔为0时，视为强制破韧，100%触发（来源可能是设置或装备）
	if (异常属性[类型].触发频率==0)
		角色属性[角色技能伤害]*=1+提升量;
	//怪物不存在此类异常
	else if (异常属性[类型].触发频率==999)
		return ;
	//非破韧状态下控制型异常不生效
	else if (类型>=伤害型异常总数 && 适用控制型异常==FALSE)
		return ;
	//伤害型异常无视破韧，或控制型异常+破韧
	else
		角色属性[角色技能伤害]*=1+提升量;
}

void DNF角色对象::单四维增加(float v)
{
	v*=附魔倍率;
	if (当前职业对象->攻击类型==物理攻击类型)
		角色属性[角色力量]+=v;
	else if (当前职业对象->攻击类型==魔法攻击类型)
		角色属性[角色智力]+=v;
}

BOOL DNF角色对象::穿戴装备检查(WCHAR* 装备名称)
{
	if (装备名称==NULL)
		return FALSE;
	for (int i=0;i<全部装备部位总数;i++)
	{
		if (i==武器 || i==武器贴膜)
			continue;
		WCHAR* 名称=NULL;
		if (角色装备[i]->空装备==FALSE)
			名称=DNF装备名称[角色装备[i]->装备Id];
		if (名称!=NULL && wcscmp(名称,装备名称)==0)
			return TRUE;
	}
	return FALSE;
}

BOOL DNF角色对象::部位穿戴装备检查(int 部位,WCHAR* 装备名称)
{
	if (装备名称==NULL)
		return FALSE;
	if (部位==武器 || 部位==武器贴膜)
		return FALSE;
	WCHAR* 名称=NULL;
	if (角色装备[部位]->空装备==FALSE)
		名称=DNF装备名称[角色装备[部位]->装备Id];
	if (名称!=NULL && wcscmp(名称,装备名称)==0)
		return TRUE;
	return FALSE;
}

BOOL DNF角色对象::穿戴CP武器检查()
{
	//切换职业时，武器自动切换至职业大系
	//CP武器可能类型不同，但职业一定是契合的
	//默认正常使用，不需要额外做判断
	DNF武器对象* 武器对象=武器动态对象;
	if (武器对象->空装备)
		return FALSE;
	if (武器对象->武器系列==胜负之役武器系列 || 武器对象->武器系列==失衡_崩离边界武器系列)
		return TRUE;
	return FALSE;
}

BOOL DNF角色对象::部位有装备(DNF装备部位 部位)
{
	if (部位==武器)
		return (武器动态对象->空装备==FALSE);
	else if (部位==武器贴膜)
		return 使用武器贴膜;
	else 
		return(角色装备[部位]->空装备==FALSE);
}

//其中"装备和贴膜"不包含武器和武器贴膜，会设为"武器"和"武器贴膜"
WCHAR* 攻速鞋部位名称[8]={L"装备和贴膜",L"装扮",L"徽章",L"勋章",L"辟邪玉",L"快捷栏装备",L"宠物装备",L"名称装饰卡"};

BOOL DNF角色对象::攻速鞋部位检查()
{
	for (int i=0;i<8;i++)
		if (wstreql(攻速鞋部位标记,攻速鞋部位名称[i]))
			return TRUE;
	return FALSE;
}

void DNF角色对象::初始化()
{
	//设置项由设置模块逐一填写，不需要初始化
	武器动态对象=new DNF武器对象;
	装扮动态对象=new DNF装扮对象;
	辟邪玉动态对象=new DNF辟邪玉对象;
	条件记录=new WCHAR[2048];
}

void DNF角色对象::反初始化()
{
	delete 武器动态对象;
	delete 装扮动态对象;
	delete 辟邪玉动态对象;
	delete[] 条件记录;
}

void DNF角色对象::初始化套装对象(int 索引,DNF装备对象* 对象)
{
	套装对象[索引]=对象;
}